// app.js
class AppBootHook {
  constructor(app) {
    this.app = app;
  }

  configWillLoad() {}

  // // 主进程启动完成后执行（仅在 master 进程触发）
  // async didLoad() {
  //   const { app } = this;
  //   // 只在 master 进程中执行（避免 worker 进程重复处理）
  //   if (app.type !== "master") return;

  //   // 等待所有 worker 启动完成（确保 workers 列表可用）
  //   await new Promise((resolve) => {
  //     app.messenger.on("egg-ready", resolve);
  //   });

  //   // 拦截 master 进程的 http server 连接事件
  //   this.overrideConnectionDistribution();
  // }

  // // 覆盖默认的连接分发逻辑
  // overrideConnectionDistribution() {
  //   const { app } = this;
  //   const server = app.server; // 获取 master 管理的 http server

  //   // 保存原始的 connection 事件处理函数（用于降级或特殊情况）
  //   const originalOnConnection = server._events.connection;
  //   server.removeAllListeners("connection");

  //   // 自定义 connection 事件处理：按 mobile 分发
  //   server.on("connection", (socket) => {
  //     this.handleConnection(socket, originalOnConnection);
  //   });
  // }

  // // 处理连接：解析 mobile 并分发到指定 worker
  // async handleConnection(socket, originalOnConnection) {
  //   const { app } = this;
  //   try {
  //     // 从 socket 中解析 HTTP 请求（获取 mobile 参数）
  //     const { mobile, req } = await this.parseMobileFromSocket(socket);

  //     if (mobile) {
  //       // 计算目标 worker ID（假设启动 2 个进程，哈希到 0 或 1）
  //       const workerId =
  //         this.hashMobile(mobile) % Object.keys(app.workers).length;
  //       const targetWorker = app.workers[workerId];

  //       if (targetWorker && targetWorker.status === "running") {
  //         // 转发连接到目标 worker
  //         targetWorker.send("connection", socket);
  //         return;
  //       }
  //     }

  //     // 无 mobile 或目标进程不可用时，使用原始分发逻辑（如轮询）
  //     originalOnConnection.call(app.server, socket);
  //   } catch (error) {
  //     console.error("解析请求或分发连接失败:", error);
  //     socket.destroy(); // 处理失败时关闭连接
  //   }
  // }

  // // 从 socket 中解析出 mobile 参数
  // parseMobileFromSocket(socket) {
  //   return new Promise((resolve, reject) => {
  //     // 监听 socket 数据事件，解析 HTTP 请求头
  //     socket.once("data", (data) => {
  //       try {
  //         // 从请求数据中提取 URL（示例：解析第一行请求行）
  //         const requestStr = data.toString();
  //         const firstLine = requestStr.split("\n")[0]; // 如：GET /api?mobile=13800138000 HTTP/1.1
  //         const url = firstLine.split(" ")[1];

  //         // 解析 URL 中的 mobile 参数
  //         const parsedUrl = new URL(url, "http://dummyhost");
  //         const mobile = parsedUrl.searchParams.get("mobile");

  //         // 将已读取的数据重新塞回 socket（避免 worker 漏读）
  //         socket.unshift(data);
  //         resolve({ mobile, req: requestStr });
  //       } catch (err) {
  //         reject(err);
  //       }
  //     });

  //     // 超时处理（防止恶意连接阻塞）
  //     setTimeout(() => reject(new Error("解析请求超时")), 5000);
  //   });
  // }

  // // 简单的 mobile 哈希函数（确保相同 mobile 映射到同一 worker）
  // hashMobile(mobile) {
  //   let hash = 0;
  //   for (let i = 0; i < mobile.length; i++) {
  //     const char = mobile.charCodeAt(i);
  //     hash = (hash << 5) - hash + char;
  //     hash |= 0; // 转为 32 位整数
  //   }
  //   return Math.abs(hash);
  // }

  async willReady() {}

  async didReady() {
    // 应用已经启动完毕
    const ctx = await this.app.createAnonymousContext();
    // 初始化Selenium窗口池
    await ctx.service.seleniumPool.init();
  }

  async serverDidReady() {}
}

module.exports = AppBootHook;
